package com.ryan.spring.annotation.config;

import com.ryan.spring.annotation.model.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * Created by kaimin on 28/1/2019.
 * time : 09:43
 * bean的生命周期
 *
 * bean创建--》初始化-》销毁
 *
 * 所有bean是容器来管理生命周期
 * 容器提供给我们自定义的初始化和销毁方法：
 * 容器在bean进行到当前生命周期的时候，
 * 就会调用我们自定义的初始化和销毁方法
 *
 * - 构造（对象创建）：
 *      - 单实例 在容器启动的时候创建对象
 *      - 多实例 在容器每次获取的时候创建对象
 *
 * - 1、指定初始化和销毁方法
 *  @Bean指定init-method和destroy-method
 * - 2、实现 接口InitializingBean（定义初始化逻辑）
 *             DisposableBean（定义销毁逻辑）
 * - 3 使用JSR250规范
 *      @PostConstruct：在bean创建完成并且属性赋值完成；来执行初始化方法
 * 		@PreDestroy：在容器销毁bean之前通知我们进行清理工作
 *
 *Spring底层对 BeanPostProcessor 的使用；
 * 		bean赋值，注入其他组件，@Autowired，生命周期注解功能，@Async,xxx BeanPostProcessor;
        这些都是通过BeanPostProcessor的使用来处理的。
 *
 */
@Configuration
@ComponentScan("com.ryan.spring.annotation.config")
public class ConfigOfLifeCycle {

    @Bean(initMethod = "init",destroyMethod = "destory")
    public Car car(){
        return new Car();
    }



}
